package simple

/*
*
https://leetcode.cn/problems/remove-linked-list-elements/
203 移除链表中的元素
*/

// 不使用 dummyHead 技巧, 头结点位置需要特殊处理
func removeElements(head *ListNode, val int) *ListNode {
	for head != nil && head.Val == val {
		head = head.Next
	}

	if head == nil {
		return head
	}

	cur := head
	for cur.Next != nil {
		if cur.Next.Val == val {
			cur.Next = cur.Next.Next
			continue
		}
		cur = cur.Next
	}
	return head
}

// 使用 dummyHead 技巧, 统一头结点和其它节点的代码逻辑
func removeElements2(head *ListNode, val int) *ListNode {
	dummyHead := &ListNode{
		Val:  -1,
		Next: head,
	}
	pre := dummyHead
	for pre.Next != nil {
		if pre.Next.Val == val {
			pre.Next = pre.Next.Next
			continue
		}
		pre = pre.Next
	}
	return dummyHead.Next
}

// 递归方式解决问题
func removeElementsR(head *ListNode, val int) *ListNode {
	if head == nil {
		return head
	}

	head.Next = removeElementsR(head.Next, val)
	if head.Val == val {
		return head.Next
	} else {
		return head
	}
}
